home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt86sep.arc / BREAKPT.ASM next >
Assembly Source File  |  1986-04-21  |  2KB  |  118 lines

  1. ; BREAKPT
  2. ; Copyright 1985, Edward Batutis
  3. ;
  4. ; Invokes the breakpoint interrupt when Ctrl-Shift-Shift
  5. ; combination is pressed.
  6.  
  7. ; Assembled with the IBM Macro Assembler Version 1.00
  8.  
  9. cseg    segment para    public 'code'
  10.     assume cs:cseg,ds:cseg
  11.     org    100h
  12.  
  13. breakpt proc
  14.  
  15.     jmp    install
  16.  
  17. copyright    db    'BREAKPT (c) Copyright 1985,'
  18.         db    ' Edward J. Batutis',01ah
  19.  
  20. old_int9_vector label    dword
  21. old_int9_offs    dw    ?
  22. old_int9_seg    dw    ?
  23.  
  24. new_int9:
  25.  
  26.     ; call old keyboard routine by simulating an int
  27.  
  28.     pushf
  29.     call    cs:old_int9_vector
  30.  
  31.     push    es        ; save registers
  32.     push    ax
  33.     push    bx
  34.  
  35.     mov    ax,40h        ; look at keyboard flag1 in
  36.     mov    es,ax        ;  ROM BIOS data area
  37.     mov    bx,17h
  38.     mov    al,es:[bx]
  39.     and    al,07h        ; mask off everything but lowest
  40.                 ;  three bits
  41.     cmp    al,7        ; are Ctrl-Shift-Shift depressed?
  42.     jne    quit        ; no, quit
  43.  
  44.     ; turn on the trap flag
  45.  
  46.     pop    bx        ; restore registers
  47.     pop    ax
  48.     pop    es
  49.  
  50.     push    ax        ; save register
  51.     pushf            ; get flags into ax
  52.     pop    ax
  53.  
  54.     or    ax,0100h    ; set trap flag on
  55.     push    ax        ; put new flags back
  56.     popf
  57.     pop    ax        ; restore ax
  58.     nop            ; wait one instruction
  59.     iret            ; debug is invoked at this instruction
  60.  
  61. quit:
  62.     pop    bx        ; restore registers when
  63.     pop    ax        ;  quitting
  64.     pop    es
  65. done:
  66.     iret
  67.  
  68. END_OF_RESIDENT_CODE    LABEL    BYTE
  69.  
  70. banner    db    'BREAKPT installed.',10,13,'$'
  71.  
  72. install:
  73.                 ; get interrupt vector for
  74.                 ; keyboard interrupt
  75.  
  76.     mov    ah,35h        ; get interrupt vector function
  77.     mov    al,9        ; get interrupt 9
  78.     int    21h
  79.  
  80.     cmp    bx,offset new_int9    ; are we already installed?
  81.     je    no_install        ; yes, just exit
  82.  
  83.     mov    old_int9_offs,bx    ; save old keyboard interrupt
  84.     mov    old_int9_seg,es     ;  address
  85.  
  86.     mov    dx,offset banner    ; print banner
  87.     mov    ah,9            ; print string function
  88.     int    21h
  89.  
  90.                     ; set keyboard interrupt
  91.                     ;  to point to new_int9
  92.     mov    ah,25h            ; set interrupt function
  93.     mov    al,9            ; set interrupt 9
  94.     mov    dx,offset new_int9    ; point to new routine
  95.     int    21h
  96.  
  97.                     ; terminate, but stay
  98.                     ;  partially resident
  99.                     ; point to last byte of resident
  100.                     ;  routines+1
  101.  
  102.     mov    dx,offset END_OF_RESIDENT_CODE+1
  103.     int    27h
  104.  
  105. no_install:
  106.     int    20h        ; don't install, just exit
  107.  
  108. breakpt endp
  109.  
  110. cseg    ends
  111.     end    breakpt
  112. _OF_RESIDENT_CODE+1
  113.     int    27h
  114.  
  115. no_install:
  116.     int    20h        ; don't install, just exit
  117.  
  118. breakpt end